backoffLimit)與完成條件(completions / parallelism)。concurrencyPolicy)。在傳統開發與維運中,我們常常需要執行一些「跑完就該結束」的工作,例如:
如果你用 Deployment 來跑這些腳本,當腳本順利執行完畢、容器正常退出(Exit Code 0)時,Deployment 的控制器會誤以為「Pod 死掉了!」,進而自動重啟它並再次執行,導致無窮迴圈重複跑腳本!
為了解決這個問題,Kubernetes 提供了兩種專門處理批次運算的控制器:
| 資源物件 | 觸發方式 | 期望生命週期 | 典型應用場景 |
|---|---|---|---|
| Job | 手動建立或 CI/CD 觸發 | 容器執行完畢後進入 Completed 狀態,不再重啟 |
資料庫遷移、大量數據批次計算 |
| CronJob | 依據 Cron 時間表達式定期觸發 | 定時自動生成一個或多個關聯的 Job 物件 | 定期資料庫備份、清理過期 Log |
pi-job.yaml我們建立一個 Job,使用 Perl 容器計算圓周率至小數點後 2000 位:
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculator-job
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never # 失敗或結束後不要隨意重啟容器
backoffLimit: 3 # 如果失敗最多重試 3 次
解析:在 Job 的 Pod 規格中,restartPolicy 只能設定為 Never 或 OnFailure,絕對不能是預設的 Always。
kubectl apply -f pi-job.yaml
# 觀察 Job 狀態
kubectl get jobs -w
幾秒鐘後,你會看到 COMPLETIONS 欄位從 0/1 變成 1/1,代表任務順利完成!
# 查看任務輸出的日誌
kubectl logs job/pi-calculator-job
終端機將印出完整的 2000 位圓周率數值!
backup-cronjob.yaml建立一個每分鐘執行一次的定時任務:
apiVersion: batch/v1
kind: CronJob
metadata:
name: minute-backup-cronjob
spec:
schedule: "*/1 * * * *" # 標準 Linux Cron 格式(每分鐘執行一次)
concurrencyPolicy: Forbid # 若上一次任務還沒跑完,禁止重疊啟動新任務
successfulJobsHistoryLimit: 3 # 保留最多 3 筆成功歷史紀錄
failedJobsHistoryLimit: 1 # 保留最多 1 筆失敗歷史紀錄
jobTemplate:
spec:
template:
spec:
containers:
- name: backup-worker
image: busybox
command: ["sh", "-c", "echo '[Backup Process] Backup database at $(date)'; sleep 5"]
restartPolicy: OnFailure
kubectl apply -f backup-cronjob.yaml
# 監控 CronJob 狀態
kubectl get cronjobs
等待 1 到 2 分鐘後,執行以下指令:
# 查看由 CronJob 自動生成的 Job 列表
kubectl get jobs
# 查看自動生成的 Pod
kubectl get pods
你會發現系統按照時間規律,自動建立了名為 minute-backup-cronjob-xxxxxxx 的 Job 與 Pod,執行完畢後 Pod 狀態會停留在 Completed。
如果某個定時任務執行時間超過了排程間隔(例如:每小時觸發一次備份,但備份花了 90 分鐘),該怎麼辦?
Kubernetes 提供了三種策略:
Allow(預設):允許同時並行執行多個 Job。Forbid(最常用):若上一個任務仍在執行,跳過本次觸發,嚴禁並行(避免資料庫備份打架造成效能暴跌)。Replace:直接終止目前還在跑的舊任務,用全新的任務取而代之。今天我們解鎖了 Kubernetes 在自動化批次與排程維運的兩大核心工具:
隨著集群裡面的應用程式、資料庫、定時任務越來越多,如何將不同的團隊(開發、測試、運維)或不同的專案隔離開來,避免彼此干擾或資源搶奪?
明天 Day 19,我們將學習多租戶隔離的核心機制:「團隊多租戶隔離:Namespace 劃分與 ResourceQuota 資源限制」!